Action Message Format

Action Message Format (AMF) is a binary format used to serialize objects graphs such ActionScript objects and XML, or send messages between an Adobe Flash client and a remote service, usually a Flash Media Server or third party alternatives.

The format is often used in conjunction with Adobe's RTMP to establish connections and control commands for the delivery of streaming media. In this case, the AMF data is encapsulated in a chunk which has a header which defines things as the message length and type (whether it is a "ping", "command" or media data).

Contents

Format Analysis

AMF was introduced with Flash Player 6, and this version is referred to as AMF0. It was unchanged until the release of Flash Player 9 and ActionScript 3.0, when new data types and language features prompted an update, called AMF3.[1]

Adobe Systems published the AMF binary data protocol specification[2] on December 13, 2007 and announced that it will support the developer community to make this protocol available for every major server platform.

AMF0

The protocol specifies a number of data types that can be encoded and Adobe states that the format is rather meant at encoding object graphs. These can be nested objects which can include basic data types such as strings, numbers and booleans. XML is supported as a native type. Each type is denoted by a single byte using the example codes below (for AMF0):

AMF Objects are sets of key value pairs, where keys are encoded as strings but without a type-definition byte in front (0x02). All other data is preceded by a type definition byte and in the case of strings, 2 bytes denoting length. Null types have no bytes while numbers are encoded as double precision floating point.

Although, strictly speaking, AMF is only a data encoding format, it is usually found encapsulated in a RTMP Message or Flex RPC call. An example of the former can be found below (it is the "_result" message returned in response to the "connect" command sent from the flash client):

Hex Code ASCII
03 00 00 00 00 01 05 14 00 00 00 00 02 00 07 5F 72 65 73 75 6C 74 00 3F F0 00 00 00 00 00 00 03 00 06 66 6D 73 56 65 72 02 00 0E 46 4D 53 2F 33 2C 35 2C 35 2C 32 30 30 34 00 0C 63 61 70 61 62 69 6C 69 74 69 65 73 00 40 3F 00 00 00 00 00 00 00 04 6D 6F 64 65 00 3F F0 00 00 00 00 00 00 00 00 09 03 00 05 6C 65 76 65 6C 02 00 06 73 74 61 74 75 73 00 04 63 6F 64 65 02 00 1D 4E 65 74 43 6F 6E 6E 65 63 74 69 6F 6E 2E 43 6F 6E 6E 65 63 74 2E 53 75 63 63 65 73 73 00 0B 64 65 73 63 72 69 70 74 69 6F 6E 02 00 15 43 6F 6E 6E 65 63 74 69 6F 6E 20 73 75 63 63 65 65 64 65 64 2E 00 04 64 61 74 61 08 00 00 00 00 00 07 76 65 72 73 69 6F 6E 02 00 0A 33 2C 35 2C 35 2C 32 30 30 34 00 00 09 00 08 63 6C 69 65 6E 74 69 64 00 41 D7 9B 78 7C C0 00 00 00 0E 6F 62 6A 65 63 74 45 6E 63 6F 64 69 6E 67 00 40 08 00 00 00 00 00 00 00 00 09 . . . . . . . . . . . . . . . _ r e s u l t . ? . . . . . . . . . f m s V e r . . . F M S / 3 , 5 , 5 , 2 0 0 4 . . c a p a b i l i t i e s . @ ? . . . . . . . . m o d e . . . . . . . . . . . . . . l e v e l . . .s t a t u s . . . c o d e . . . N e t C o n n e c t i o n . C o n n e c t . S u c c e s s . . d e s c r i p t i o n . . . C o n n e c t i o n su c c e e d e d . . d a t a . . . . . . . version . . . 3 , 5 , 5 , 2 0 0 4 . . . . . . c l i e n t i d . . . . . . . . . . . o b j e c t E n c o d i n g . @ . . . . . . . . . .

legend: object start/end object keys object values array

The AMF message starts with a 0x03 which denotes an RTMP packet with Header Type of 0, so we expect 12 bytes to follow. It is of Message Type 0x14 which denotes a command in the form of a string of value "_result" and two serialised objects as arguments. The message can be decoded as follows:

(command) “_result”
(transaction id) 1
(value)
[1] { fmsVer: "FMS/3,5,5,2004"
        capabilities: 31.0
        mode: 1.0 },
[2] { level: “status”,
        code: “NetConnection.Connect.Succeeded",
        description: “Connection succeeded”,
        data: (array) {
               version: “3,5,5,2004” },
        clientId: 1584259571.0,
        objectEncoding: 3.0 }

Here we can see an array (in turquoise) as a value of the 'data' key which has one member. We can see the objectEncoding value to be 3. This means that subsequent messages are going to be sen with the 0x11 message type which will imply an AMF3 encoding.

AMF3

The newer version of the protocol specifies some changes in the data types above. A message containing AMF3 encoded data has the message type byte set to 0x11 instead of 0x14 and will contain an extra 0x00 byte at the end of the header. AMF3 is in fact encapsulated within AMF0 and it is possible that a message of type AMF3 to contain no such data. The data type markers are as follows:

Support for AMF

The various AMF Protocols are supported by many server-side languages and technologies, in the form of libraries and services that must be installed and integrated by the application developer.

Platforms:

Frameworks:

See also

References

  1. ^ AMF 0 Specification
  2. ^ AMF 3 Specification
  3. ^ Features | Adobe ColdFusion 9 Standard